from django.shortcuts import render
from rest_framework.views import APIView
import random,logging
from django_redis import get_redis_connection
from . import constants
from rest_framework.response import Response
from rest_framework import status
from celery_tasks.sms.tasks import send_sms_code

from meiduo_mall.libs.yuntongxun.sms import CCP


# Create your views here.

logger = logging.getLogger('django')



class SMSCodeView(APIView):
    """发送短信验证码"""
    def get(self,request,mobile):
        """
        GET /sms_codes/(?P<mobile>1[3-9]\d{9})/ 
        """
        # 创建连接到redis对象
        redis_coon = get_redis_connection('verify_codes')

        # 先判断用户在60s秒是否频繁发送短信
        send_flag = redis_coon.get("send_flag_%s" % mobile)
        # 如果send_flag 有值，说明60s内重复发送短信
        if send_flag:
            return Response({'message':'请勿频繁发送短信'},status=status.HTTP_400_BAD_REQUEST)

        # 生成短信验证码
        sms_code = "%06d" % random.randint(0,999999)
        logger.info(sms_code)   # 打印到日志


        # 创建管道，将多条reids命令放在一个管道里面，统一执行，减少redis的访问频率，提升性能
        # 一次执行多条redis命令，避免多条命令多次访问redis数据库
        pl = redis_coon.pipeline()

        # 将短信验证码存储到redis数据库中
        # redis_coon.setex("sms_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)
                            # key    过期时间   值
        pl.setex("sms_%s" % mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code)


        # 在redis中添加一个发送短信的标记
        # redis_coon.setex("send_flag_%s" % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)
        pl.setex("send_flag_%s" % mobile, constants.SEND_SMS_CODE_INTERVAL, 1)

        # 执行管道。使用pipeline 时，必须调用execute()执行一下
        pl.execute()

        # 使用云通讯发送短信验证码
        # CCP().send_template_sms(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES // 60], 1)
                               # 手机号  验证码    过期时间                                短信模板默认为1

        # 调用delay() 触发celery异步任务
        send_sms_code.delay(mobile, sms_code)
        # send_sms_code(mobile, sms_code) # 仅仅只是调用普通的函数而已，跟celery没有关系
        # 响应结果
        return Response({'message':'OK'})